package model

import (
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
	"path/filepath"
)

func Model(app *iris.Application) {
	// 1.添加路由组
	userRoute(app.Party("/user", next))
	baseRoute(app.Party("/base", next))
}

// 继续解析下一级路由，查找到对应的处理方法
func next(context *context.Context) {
	context.Next()
}

// 文件上传下载路由组
func baseRoute(party iris.Party) {
	log := party.Logger()
	// 文件上传
	party.Post("/upload", func(context *context.Context) {
		// 处理单个文件
		_, header, err := context.FormFile("file")
		if err != nil {
			panic(any(err.Error()))
		}
		dest := filepath.Join("upload", header.Filename)
		// 保存文件到指定目录
		context.SaveFormFile(header, dest)
		log.Infof("文件: %s 已保存！", header.Filename)
		context.Writef("文件: %s 已保存！", header.Filename)
	})

	// 文件下载
	party.Post("/export", func(context *context.Context) {
		src := "upload/2.jpg"
		// 写出文件
		context.SendFile(src, src[len(src)-4:])
		log.Info("下载完成")
	})
}

// 用户测试路由组
func userRoute(party iris.Party) {

	log := party.Logger()

	// 2.get请求，获取URL中的参数
	party.Get("/getUser", func(context *context.Context) {
		log.Infof("访问的路径为：%v\n", context.Path())
		// 获取所有参数
		name := context.Params().Get("name")
		// 获取指定参数
		age := context.URLParam("age")
		// 返回字符串
		_, err := context.WriteString("post请求，入参name = " + name + "，age = " + age)
		if err != nil {
			panic(any(err.Error()))
		}
	})

	// 3.post请求，JSON格式参数
	party.Post("/jsonArgs", func(context *context.Context) {
		log.Infof("访问的路径为：%v\n", context.Path())
		var user User
		// 入参JSON格式获取
		if err := context.ReadJSON(&user); err != nil {
			panic(any(err.Error()))
		}
		log.Infof("获取到的对象：%v\n", user)
		// 出参JSON格式
		if err := context.JSON(user); err != nil {
			panic(any(err.Error()))
		}
	})

	// 4.post请求，XML格式参数
	party.Post("/xmlArgs", func(context *context.Context) {
		log.Infof("访问的路径为：%v\n", context.Path())
		var user User
		// 入参XML格式获取
		if err := context.ReadXML(&user); err != nil {
			panic(any(err.Error()))
		}
		log.Infof("获取到的对象：%v\n", user)
		// 出参XML格式
		if err := context.XML(user); err != nil {
			panic(any(err.Error()))
		}
	})

}

type User struct {
	Name string `json:"name" xml:"name"`
	Age  int    `json:"age" xml:"age"`
}
